package com.wjx.demo.`fun`

fun sum(a:Int,b:Int):Int{
    return a+b
}

fun sum1(a:Int,b:Int)=a+b

public fun sum2(a:Int,b:Int):Int=a+b   //public 方法必须显示指定返回类型

fun sum3(a:Int,b:Int) :Unit{   //Unit 是void的意思，可以省略，会自动推断
    print(a+b)
}

public fun sum4(a:Int,b:Int){  // 如果是返回 Unit类型，则可以省略(对于public方法也是这样)：
    print(a+b)
}

fun vars(vararg vals:Int){  //可变参数可用 vararg  标志
    for (v in vals) println(v)
}


fun main(args:Array<String>){
    val i=sum(1,2)
    vars(1,2,3)

    val lamba1:(Int,Int)->Int={x,y->(x+y)}  //lamba 表达式
    println(lamba1(1,2))


    var a:Int=1  //可变变量定义：var 关键字
    val b:Int=2 //不可变变量定义：val 关键字，只能赋值一次的变量(类似Java中final修饰的变量)
    println(a+b)

    /**
    val a: Int = 1
    val b = 1       // 系统自动推断变量类型为Int
    val c: Int      // 如果不在声明时初始化则必须提供变量类型
    c = 1           // 明确赋值
    var x = 5        // 系统自动推断变量类型为Int
    x += 1           // 变量可修改
     */
    var c=1
    println(c)

//    $ 表示一个变量名或者变量值
//    $varName 表示变量值
//    ${varName.fun()} 表示变量的方法返回值:
    var aa = 1
// 模板中的简单名称：
    val s1 = "a is $aa"
    println(s1)

    aa = 2
// 模板中的任意表达式：
    val s2 = "${s1.replace("is", "was")}, but now is $aa"
    println(s2)

    //字段后加!!像Java一样抛出空异常，另一种字段后加?可不做处理返回值为 null或配合?:做空判断处理
    var s3:String?="123"
    var s4 =s3!!.toInt()
    var s5=s3?.toInt()
    var s6=s3?.toInt() ?: -1

    for(i in 1..4) print(i)
    println()
    for(i in 1..4 step 2) print(i)
    println()
    for(i in 4 downTo 1 step 2) print(i)
    println()
    for(i in 1 until 4) print(i)  //输出123
    println()

    fun a(s: String = ",", b: Int = 1) {
        println("$s " + b)
    }
    a(s = ":")

}
//当一个引用可能为 null 值时, 对应的类型声明必须明确地标记为可为 null。
//当 str 中的字符串内容不是一个整数时, 返回 null:
//fun parseInt(str: String): Int? {}


